Programming¶

In [ ]:
import pandas as pd
import numpy as np
import os
import plotly.express as px
import plotly.graph_objects as go
import matplotlib.pyplot as plt

# display all columns
pd.set_option('display.max_columns', None)
# ignore warnings
pd.options.mode.chained_assignment = None

import plotly.io as pio
pio.renderers.default='notebook' # make plots visible in html

# define the template for the plots
template = 'simple_white'   

Import Dataframes¶

The data is downloaded from www.unhcr.org. UNHCR, also known as the UN Refugee Agency, is a global organisation with the noble mission of saving lives, protecting rights, and fostering better futures for people forced to flee their homes. They collect data on immigration and refuge worldwide.

This data concerns the number of applications for asylum in countries around the world.

In order to obtain the latitude and longitude of the countries, a function was created to map them to the data. Please note that an internet connection is required to retrieve the geographical positions. In the Jupyter Notebook, SaveLatLonToCSV.ipynb, the geo information about those countries is fetched and stored in a .csv file (iso_lat_long.csv), which is then imported.

Columns:

Year: The Year

Country of origin: Country of origin

Country of asylum: Country in which they ask for asylum

Country of origin (ISO): Country of origin ISO Code

Country of asylum (ISO): Countries ISO Code in which they ask for asylum

Applied: The amount of asylum applications

Authority, Application type, Stage of Procedure, and Cases / Persons: Additional information

In [ ]:
cwd = os.getcwd()
path_asyl = os.path.join(cwd, 'data', 'query_data-2', 'asylum-applications.csv')

IDA¶

In [ ]:
df_asyl = pd.read_csv(path_asyl)
display(df_asyl.head(3))
print(df_asyl.shape)
print(df_asyl.info())
Year Country of origin Country of origin (ISO) Country of asylum Country of asylum (ISO) Authority Application type Stage of procedure Cases / Persons applied
0 2015 Afghanistan AFG Australia AUS G A AR C 22
1 2015 Albania ALB Australia AUS G A AR C 7
2 2015 Algeria DZA Australia AUS G A AR C 5
(49024, 10)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 49024 entries, 0 to 49023
Data columns (total 10 columns):
 #   Column                   Non-Null Count  Dtype 
---  ------                   --------------  ----- 
 0   Year                     49024 non-null  int64 
 1   Country of origin        49024 non-null  object
 2   Country of origin (ISO)  49024 non-null  object
 3   Country of asylum        49024 non-null  object
 4   Country of asylum (ISO)  49024 non-null  object
 5   Authority                49024 non-null  object
 6   Application type         49024 non-null  object
 7   Stage of procedure       48305 non-null  object
 8   Cases / Persons          49024 non-null  object
 9   applied                  49024 non-null  int64 
dtypes: int64(2), object(8)
memory usage: 3.7+ MB
None
In [ ]:
df_asyl_grp = df_asyl.groupby(by=['Year','Country of origin (ISO)', 'Country of asylum (ISO)', 
                                  'Country of asylum', 'Country of origin']).sum(numeric_only=True).reset_index().sort_values(by='Year', ascending=False)

# Rename Venezuela (Bolivarian Republic of) to Venezuela, RB
df_asyl_grp.loc[df_asyl_grp['Country of origin'].str.contains('Venezuela'), 'Country of origin'] = 'Venezuela, RB'

Where are the most refugees come from each year?¶

In [ ]:
df_most_asyl = df_asyl_grp.groupby(by=['Year', 'Country of origin'])['applied'].sum().to_frame().reset_index()
df_most_asyl.head(10)
Out[ ]:
Year Country of origin applied
0 2015 Afghanistan 280343
1 2015 Albania 73986
2 2015 Algeria 10487
3 2015 Andorra 5
4 2015 Angola 2835
5 2015 Antigua and Barbuda 19
6 2015 Argentina 97
7 2015 Armenia 7073
8 2015 Australia 5
9 2015 Azerbaijan 3780
In [ ]:
# define the highlight countries
highlight_list = ['Venezuela, RB', 'Afghanistan', 'Syrian Arab Rep.','Iraq', 'Ukraine']
dataframes = {}
for element in highlight_list:
    dataframes[element] = df_most_asyl[df_most_asyl['Country of origin'] == element]
In [ ]:
# define function for line plot
import seaborn as sns
def line_plot(df_most_asyl, dataframes, title=''):

    fig = px.line(df_most_asyl, x='Year', y='applied', 
                line_group='Country of origin', labels={'applied':'Number of Asylum Applications', 'year':'Year'},
                title=title, template=template)

    fig.update_layout(showlegend=True,
        plot_bgcolor='white',
        title_x=0.5,
        xaxis=dict(
            showline=True,
            showgrid=False,
            showticklabels=True,
            linecolor='rgb(204, 204, 204)',
            linewidth=2,
            ticks='outside',
            tickfont=dict(
                family='Arial',
                size=12,
                color='rgb(82, 82, 82)',
            ),
        ),
        yaxis=dict(
            showgrid=True,
            zeroline=False,
            showline=True,
            showticklabels=True,
            linecolor='rgb(204, 204, 204)',
            linewidth=2,
            ticks='outside',
            tickfont=dict(
                family='Arial',
                size=12,
                color='rgb(82, 82, 82)',),)
    )

    fig.update_traces(line=dict(color='grey', width=0.7), selector=dict(mode='lines'), opacity=0.5)

    # define the colors for the highlight countries
    colors = sns.color_palette('Blues_r', n_colors=len(highlight_list))
    rgb_colors = ["rgba"+str((int(r*255), int(g*255), int(b*255), (1))) for r, g, b in colors]
    line_style_list = ['solid', 'dash', 'dot', 'dashdot', 'longdash']

    for i, col in enumerate(highlight_list):
        fig.add_trace(go.Scatter(
            x=dataframes[col].Year, 
            y=dataframes[col].applied, 
            mode='lines+markers+text', 
            name=col,
            line=dict(color=rgb_colors[i], width=3, dash=line_style_list[i])  # Setzen Sie die Farbe und die Linienbreite auf die gewünschten Werte
        ))
    # Add annotation Venezuela
    fig.add_annotation(x=2019, y=440805,
                text="Peak of the Venezuela Refugee Crisis",
                showarrow=True,
                yshift=10)
    
    # Add annotation Venezuela Crisis
    fig.add_annotation(x=2016, y=500000,
                text="Start of Venezuela Refugee Crisis",
                showarrow=True,
                yshift=-20,
                xshift=0)
    
    # Add annotation Covid-19
    fig.add_annotation(x=2020, y=440805,
                text="Start of Covid-19 Pandemic",
                showarrow=True,
                yshift=-20,
                xshift=0)
    
    # Add vertical line Venezuela Crisis 
    fig.add_shape(
        dict(
            type="line",
            x0=2016,
            y0=0,
            x1=2016,
            y1=450000,
            line=dict(
                color="Black",
                width=2
            )
        )
    )

    # Add vertical line Covid-19
    fig.add_shape(
        dict(
            type="line",
            x0=2020,
            y0=0,
            x1=2020,
            y1=390000,
            line=dict(
                color="Black",
                width=2
            )
        )
    )


    # fig.show()
    return fig
In [ ]:
df_most_asyl_year = df_most_asyl.loc[df_most_asyl.Year == 2019].nlargest(10, columns='applied').sort_values(by='applied', ascending=True)
In [ ]:
# function for barchart
def plot_barchart(df_most_asyl_year, title=''):
    fig = go.Figure(go.Bar(
        x=df_most_asyl_year['applied'], 
        y=df_most_asyl_year['Country of origin'], 
        text=df_most_asyl_year['Country of origin'],  # setting the text for the values
        textposition='auto',  
        insidetextanchor='end',  
        orientation='h',
        marker=dict(color='rgb(66, 146, 198)', line=dict(color='rgb(8,48,107)', width=0.5)),
        textfont=dict(size=12)
    ))

    # Plotting another individual barplot and change it to invisible
    fig.add_trace(go.Bar(
        x=df_most_asyl_year['applied'], 
        y=df_most_asyl_year['Country of origin'], 
        text=df_most_asyl_year['applied'],    
        textposition='auto',  
        insidetextanchor='start',  
        orientation='h',
        marker=dict(color='rgba(0,0,0,0)', line=dict(color='rgba(0,0,0,0)', width=1.5)), # make this plot invisible
        textfont=dict(size=12)
    ))

    fig.update_layout(
        title=title,
        title_x = 0.5,
        xaxis=dict(
            title='Number of Refugees',  
            showline=True,
            showgrid=False,
            showticklabels=True,
            linecolor='rgb(204,204, 204)',
            linewidth=2, ticks='outside', tickfont=dict(
                family='Arial', size=12, color='rgb(82, 82, 82)'),
            range=[0, 500000]
        ),
        yaxis=dict(
            title='', 
            showgrid=False, zeroline=False, showline=False,
            showticklabels=False),
        autosize=True,
        showlegend=False, plot_bgcolor='white',
        barmode='stack',
        height=500,
        #width=1200,  
    )
    #fig.show()
    return fig

Selecting the Venezuela Data¶

In [ ]:
# select df for Venezuela
df_venez = df_asyl_grp.loc[df_asyl_grp['Country of origin'] == 'Venezuela, RB']
In [ ]:
# group by year and country of asylum
df_venez_asylum = df_venez.groupby(by=['Year','Country of asylum (ISO)'])['applied'].sum(numeric_only=True).reset_index().sort_values(by='Year', ascending=True)

Sankey Diagram¶

In [ ]:
def select_df_year(df: pd.DataFrame, year: int) -> pd.DataFrame:
    """ Selects the data for a specific year from the DataFrame df"""
    return df.loc[df.Year == year]
In [ ]:
def get_links(df: pd.DataFrame, year: int) -> pd.DataFrame:
    """ Creates a DataFrame of year with the links between the countries"""
    df = select_df_year(df, year)
    links = df.groupby(by=['Country of origin', 'Country of asylum']).sum(numeric_only=True).reset_index()[['Country of origin', 'Country of asylum', 'applied']]
    links.columns = ['source', 'target', 'value']
    return links

links = get_links(df_asyl_grp, 2015)
In [ ]:
def processingSankeyData(df: pd.DataFrame, year,title, n_largest=50, height=800)-> go.Figure:
    """ Process the data for the Sankey Diagram and plot it"""

    df = get_links(df, year)
    df = df.nlargest(n_largest, columns='value')
    # Processing the data for the Sankey Diagram
    unique_source_target = list(pd.unique(df[['source', 'target']].values.ravel('K')))
    mapping_dict = {k: v for v, k in enumerate(unique_source_target)}
    df['source'] = df['source'].map(mapping_dict)
    df['target'] = df['target'].map(mapping_dict)
    
    # define color palette for the plot
    import seaborn as sns
    colors = sns.color_palette('Blues_r', n_colors=len(unique_source_target))
    
    # Covert the colors to rgba
    rgb_colors = ["rgba"+str((int(r*255), int(g*255), int(b*255), (1))) for r, g, b in colors]
    
    links_dict = df.to_dict(orient='list')

    # set color for links
    link_colors = [rgb_colors[src] for src in links_dict['source']]

    # plotting Sankey Diagram
    fig = go.Figure(data=[go.Sankey(
    node = dict(
        pad = 10,
        thickness = 20,
        line = dict(color = "white", width = 0.5),
        label = unique_source_target,
        color = 'rgb(66, 146, 198)', 
        align='left',
        #font=dict(size=12, color='white'),
    ),
    link = dict(
        source = links_dict['source'], 
        target = links_dict['target'],
        value = links_dict['value'],
        label = links_dict['value'],
        color = rgb_colors,  
        arrowlen=15,
        customdata=links_dict['value'],
        hovertemplate='Number of Asylum Applications: %{customdata}<extra></extra>'
    ))])
    

    fig.update_layout(
        title_text=title, 
        font_size=12,
        font = dict(size=14, color='black', style='normal'), 
        height=height,
        #plot_bgcolor='black',
        paper_bgcolor='white',)
    # fig.show()
    
    return fig
In [ ]:
# Test Sankey Diagram
processingSankeyData(df_asyl_grp, year=2019, n_largest=50, title='Sankey Diagram of the Asylum Seekers in 2019').show()

Geolineplots¶

In [ ]:
# load iso_lat_long.csv
df_iso_code = pd.read_csv('iso_lat_long.csv')
display(df_iso_code.head(5))
iso_code iso_lat_long
0 ZMB (-14.5189121, 27.5589884)
1 CIV (7.9897371, -5.5679458)
2 DNK (55.670249, 10.3333283)
3 DEU (51.1638175, 10.4478313)
4 CZE (49.7439047, 15.3381061)
In [ ]:
# split the iso_lat_long column into latitude and longitude
df_iso_code[['latitude', 'longitude']] = df_iso_code['iso_lat_long'].str[1:-1].str.split(',', expand=True)
df_iso_code[['latitude', 'longitude']] = df_iso_code[['latitude', 'longitude']].astype(float)
df_iso_code.head(3)
Out[ ]:
iso_code iso_lat_long latitude longitude
0 ZMB (-14.5189121, 27.5589884) -14.518912 27.558988
1 CIV (7.9897371, -5.5679458) 7.989737 -5.567946
2 DNK (55.670249, 10.3333283) 55.670249 10.333328
In [ ]:
# define a dictionary for the iso_code and the latitude and longitude
iso_code_dict_lat = df_iso_code.set_index('iso_code')['latitude'].to_dict()
iso_code_dict_lon = df_iso_code.set_index('iso_code')['longitude'].to_dict()

# Map the latitude and longitude data to the asylum and origin countries
df_venez.loc[:,'asylum_lat'] = df_venez.loc[:,'Country of asylum (ISO)'].map(iso_code_dict_lat);
df_venez.loc[:,'asylum_lon'] = df_venez.loc[:,'Country of asylum (ISO)'].map(iso_code_dict_lon);
df_venez.loc[:,'origin_lat'] = df_venez.loc[:,'Country of origin (ISO)'].map(iso_code_dict_lat);
df_venez.loc[:,'origin_lon'] = df_venez.loc[:,'Country of origin (ISO)'].map(iso_code_dict_lon);
df_venez.head(2)
Out[ ]:
Year Country of origin (ISO) Country of asylum (ISO) Country of asylum Country of origin applied asylum_lat asylum_lon origin_lat origin_lon
32199 2023 VEN HND Honduras Venezuela, RB 28 15.257243 -86.075514 8.001871 -66.110932
32217 2023 VEN USA United States of America Venezuela, RB 91592 39.783730 -100.445882 8.001871 -66.110932
In [ ]:
import pycountry

# function to get the flag of the country
def get_flag(code):
    try:
        country = pycountry.countries.get(alpha_3=code)
        return country.flag
    except:
        pass
    return None

# get the flag of the asylum and origin countries
df_venez['asylum_flag'] = df_venez['Country of asylum (ISO)'].apply(get_flag)
df_venez['origin_flag'] = df_venez['Country of origin (ISO)'].apply(get_flag)
display(df_venez.head(5))
Year Country of origin (ISO) Country of asylum (ISO) Country of asylum Country of origin applied asylum_lat asylum_lon origin_lat origin_lon asylum_flag origin_flag
32199 2023 VEN HND Honduras Venezuela, RB 28 15.257243 -86.075514 8.001871 -66.110932 🇭🇳 🇻🇪
32217 2023 VEN USA United States of America Venezuela, RB 91592 39.783730 -100.445882 8.001871 -66.110932 🇺🇸 🇻🇪
32216 2023 VEN URY Uruguay Venezuela, RB 504 -32.875555 -56.020153 8.001871 -66.110932 🇺🇾 🇻🇪
32215 2023 VEN TTO Trinidad and Tobago Venezuela, RB 3463 10.746690 -61.084007 8.001871 -66.110932 🇹🇹 🇻🇪
32214 2023 VEN SWE Sweden Venezuela, RB 95 59.674971 14.520858 8.001871 -66.110932 🇸🇪 🇻🇪
In [ ]:
# select the data for the year 2019
df_venez_2019 = select_df_year(df_venez, 2019)
In [ ]:
def plot_geo_lines(df, year, n_largest, start_lon_col, start_lat_col, end_lon_col, end_lat_col, title='Title', template='plotly_white', lataxis=[-60, 90], 
                   lonaxis=[-130, 60], add_flags=False, add_names=False, show_fig=False, height=800, width=1200, y_title=0.95): 
    import numpy as np
    import seaborn as sns
    df = select_df_year(df, year)
    df = df.nlargest(n_largest, columns='applied')
    df_color = get_links(df, year)
    unique_source_target = list(pd.unique(df_color[['source', 'target']].values.ravel('K')))
    colors = sns.color_palette('Blues_r', n_colors=len(unique_source_target))
    rgb_colors = ["rgba"+str((int(r*255), int(g*255), int(b*255), (1))) for r, g, b in colors]
    range_list = np.arange(0, df.applied.max()+1, df.applied.max()/10)
    values = [1, 3.6, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 8]
    for i in range(len(values)):
        df.loc[df.applied.between(range_list[i], range_list[i+1]), 'bin_value'] = values[i]
    fig = go.Figure()

    lons = np.empty(3 * len(df))
    lons[::3] = df[start_lon_col]
    lons[1::3] = df[end_lon_col]
    lons[2::3] = None
    lats = np.empty(3 * len(df))
    lats[::3] = df[start_lat_col]
    lats[1::3] = df[end_lat_col]
    lats[2::3] = None
    df = df.reset_index(drop=True)
    color_countries = pd.concat([df['Country of asylum (ISO)'], pd.Series(['VEN'])])
    colors_value = df['applied']

    # Add Venezuela in Color
    fig.add_trace(go.Choropleth(
        locations=['VEN'], 
        z=[1],
        colorscale=[(0, 'yellow'), (1, 'yellow')],
        marker_line_width=0.8,
        locationmode='ISO-3',
        showscale=False,
        hoverinfo='none'
    ))
    hover_text = [f"Country: {country}<br>Number of Asylum Applications: {value}" for country, value in zip(df['Country of asylum'], df['applied'])]

    # add Countries of Asylumn to the map
    fig.add_trace(go.Choropleth(
        locations=color_countries, 
        z=colors_value,
        text=hover_text,
        zmin=colors_value.mean() - colors_value.std()*2,
        zmax=colors_value.mean() + colors_value.std(),
        colorscale='Blues',
        autocolorscale=False,
        reversescale=False,
        marker_line_width=0.8,
        locationmode='ISO-3',
        showscale=False,
        hoverinfo='text'
    ))

    customdata = np.stack(df['applied'], axis=-1) 
    for i in range(len(df)):
        start_lon = df.loc[i, start_lon_col]
        start_lat = df.loc[i, start_lat_col]
        end_lon = df.loc[i, end_lon_col]
        end_lat = df.loc[i, end_lat_col]

        # Add lines with arrow
        fig.add_trace(
            go.Scattergeo(
                lon = [start_lon, end_lon],
                lat = [start_lat, end_lat],
                mode = 'lines+markers',
                line = dict(width = df.loc[i, 'bin_value'], color = 'red'),
                marker = dict(size=10, color='red', symbol='arrow-bar-down'),
                opacity = 0.5,
                text=hover_text[i],
                hoverinfo='text'
            ))
        # Add flags
        if add_flags:   
            fig.add_trace(
                go.Scattergeo(
                    lon=[end_lon],
                    lat=[end_lat+2.3],
                    mode='markers+text',
                    hoverinfo='none',
                    text=[df.loc[i, 'asylum_flag']],
                    textposition='middle center',
                    textfont=dict(size=25),                
                    marker=dict(size=1, color='red')
                )
            )
        # Add names
        if add_names:
            country_name = df.loc[i, 'Country of asylum (ISO)']
            text = f'<span style="background-color: white; color: black; padding: 4px; border-radius: 15px;">{country_name}</span>'
            fig.add_trace(
                go.Scattergeo(
                    lon=[end_lon],
                    lat=[end_lat-0.5],
                    mode='markers+text',
                    hoverinfo='none',
                    text=text,
                    textposition='bottom center',
                    textfont=dict(size=14, weight='bold', color='red'),                
                    marker=dict(size=1, color='red'),
                    
                    ))

    # Adding annotation at a specific lat and lon
    annotation_text = "Data Source: UNHCR - The UN Refugee Agency"
    x = 0.5
    y = 0.01

    fig.add_annotation(
        x=x,
        y=y,
        xref='paper',
        yref='paper',
        text=annotation_text,
        showarrow=False,
        font=dict(size=12, color='black'),
        align='center',
        opacity=0.8
    )

    fig.update_layout(
        title=dict(
            text=title,
            x=0.5,
            y=y_title,
        ),
        showlegend=False,
        dragmode=False,
        geo=dict(
            scope='world',
            projection_type='equirectangular',
            showland=True,
            showcountries=True,
            showocean=True,
            countrywidth=0.5,
            oceancolor='rgba(250, 250, 255, 1)',
            lataxis=dict(range=lataxis),  
            lonaxis=dict(range=lonaxis)
        ),
        height=height,
        #width=width,
    )

    if show_fig:
        fig.show()
        return None
    return fig
In [ ]:
from plotly.subplots import make_subplots

def geo_subplots(df_venez):

    # define the figure with subplots
    fig = make_subplots(rows=2, cols=1, 
                        subplot_titles=(" ", " "), 
                        specs=[[{"type": "scattergeo"}], 
                                [{"type": "sankey"}],
                            ])



    fig2 = plot_geo_lines(df_venez,
                year=2019,
                n_largest=10, 
                start_lon_col='origin_lon', 
                start_lat_col='origin_lat', 
                end_lon_col='asylum_lon', 
                end_lat_col='asylum_lat', 
                title='', 
                template='plotly_white',
                lataxis=[-70, 70],
                lonaxis=[-120, 30],
                add_flags=True,
                add_names=True)

    fig3 = processingSankeyData(df_venez, year=2019, n_largest=10, title='')


    # traces of scattergeo
    for i in range(len(fig2.data)):
        fig.add_trace(fig2.data[i], row=1, col=1)
    # traces of sankey
    fig.add_trace(fig3.data[0], row=2, col=1)

    #fig.update_layout(fig1.layout)
    fig.update_layout(fig2.layout)
    fig.update_layout(
        autosize=True,

    )

    # Zeigen Sie die Subplot-Figur an
    
    return fig

Story¶

The Venezuelan Refugee Crisis: The Fall of a Nation¶

Venezuela was previously regarded as one of the most prosperous countries in Latin America, with considerable oil reserves. Since Maduro assumed the presidency in 2013, the country has faced significant challenges. The once-democratic nation is currently facing significant challenges, including economic collapse and a government that is struggling to meet the needs of its people. With the highest inflation in the world, many Venezuelans are struggling to afford food and medicine. GDP has fallen to a level that is higher than that experienced in the US during the Great Depression, and the homicide rate is one of the highest in the world. These challenges have prompted a significant number of Venezuelans to express their concerns and dissatisfaction with the current government, leading to widespread protests against President Nicolás Maduro.

When oil prices fell in 2014, it would have been advisable for Maduro to adjust Venezuela's economy. The rise in inflation has made essential items unaffordable for many in the lower income brackets. It seems that Maduro may have been attempting to manipulate the economy for political gain. It has been reported that he set an official exchange rate of 10 bolivars to the US dollar for his allies, while the black market rate was around 12,000 bolivars to the dollar. This unfortunately served to further exacerbate the situation.

In 2016, Maduro made the decision to place the military in charge of the food supply, which allowed them to profit by importing food at a reduced cost and selling it on the black market. This corruption helped him stay in power with military and political support. As a result, many Venezuelans chose to leave the country to escape violence, hunger and high inflation, seeking safety and stability in other countries. It was at this time, and long before, that the collapse of a nation began and many Venezuelans began to seek refuge around the world, as shown in Figure 1.

In [ ]:
plot_geo_lines(df_venez,year=2019,n_largest=30, start_lon_col='origin_lon', start_lat_col='origin_lat', 
               end_lon_col='asylum_lon', end_lat_col='asylum_lat', title='(Figure 1) - 2019: Venezuela Refugee Movement', 
               template='plotly_white',lataxis=[-90, 90],lonaxis=[-180, 190], 
               add_flags=True, add_names=False, show_fig=False, height=800, y_title=0.9).show()

Figure 1 offers an insight into the scale of efforts made by Venezuelans in 2019, and the destinations to which they sought refuge. The majority sought refuge in neighbouring South American countries, but it is notable that a significant number also fled to Europe, the US, Canada and Australia. This illustrates the global reach of the Venezuelan refugee crisis.

As the situation in Venezuela deteriorated and poverty and violence intensified, the country faced a significant challenge with regards to internal displacement. This is the largest such crisis in the history of Latin America.

In [ ]:
line_plot(df_most_asyl, dataframes, title='(Figure 2) - Tracking Asylum Applications by Country: 2015-2023').show()

In comparing the number of asylum applications, it becomes evident that Venezuela stands out dramatically in 2019. Figure 1 illustrates that while the number of asylum seekers from Syria, Afghanistan and Ukraine has decreased, the number of Venezuelan refugees has increased significantly from the beginning of the crisis in 2016 to 2019. By 2019, more than 440,000 Venezuelans had applied for asylum, although this number saw a decline as the global spread of the Covid-19 pandemic, led to a challenging environment for many.

Figure 3 illustrates that the number of applications from Venezuela reached over 440,000 in 2019. This represents a significant increase compared to the number of refugees from Afghanistan and Syria combined.

In [ ]:
plot_barchart(df_most_asyl_year, title='(Figure 3) - 2019: Ranking the Top 10 Countries by Number of Asylum Applications').show()

Where did the Venezuelans go in 2019?¶

As illustrated in Figure 4, the majority of Venezuelan refugees have sought asylum in neighbouring countries such as Colombia, Peru and Brazil. Some opted to apply for asylum in countries further afield, including the United States and Spain. Despite the challenges, many Venezuelans continue to seek better living conditions and safety elsewhere. The majority of Venezuelan refugees have found safety in neighbouring countries such as Peru, Brazil and Colombia. It would appear that Peru is currently the country that has taken the greatest number of refugees, with nearly 260,000, while Brazil has taken nearly 50,000.

It is also worth noting that a significant number of Venezuelans have sought refuge in Europe, with Spain being a notable destination, having hosted 41,000 individuals. Additionally, 35,600 individuals sought refuge in the United States, where they were able to pursue legal avenues for their stay and contribute to the economy. Despite the difficulties they face, many Venezuelan refugees are striving to rebuild their lives and become part of their host communities.

In [ ]:
processingSankeyData(df_venez, year=2019, n_largest=10, title='(Figure 4) - Major Destinations for Venezuelan Refugees: Top 10 Countries', height=370).show()
plot_geo_lines(df_venez,year=2019,n_largest=10, start_lon_col='origin_lon', start_lat_col='origin_lat', end_lon_col='asylum_lon', end_lat_col='asylum_lat', 
               title='(Figure 5) - 2019: Venezuelas Refugee Movement: Top 10 Countries', template='plotly_white',lataxis=[-60, 60],lonaxis=[-120, 30],
               add_flags=True,add_names=True,show_fig=False, height=1000, y_title=0.92).show()

The UN Refugee Agency (UNHCR), in partnership with governments, partner organisations, civil society, and other UN agencies, is working diligently to protect Venezuelan refugees and migrants. They provide assistance in border areas, legal aid and counselling, while also promoting socioeconomic inclusion.

UNHCR works in close collaboration with local authorities, civil society, and the private sector with the aim of integrating refugees into host communities. They also provide support for vocational training and relocation to areas with better employment opportunities and services. It is estimated that seventeen countries in Latin America and the Caribbean host around 80% of Venezuelan refugees, which has resulted in the largest external displacement crisis in the region's history. It is estimated that thousands of people have crossed South America on foot, with many not knowing their final destination. Some have been reunited with loved ones, while others have left behind families and communities.

Those seeking refuge and migrants use a variety of routes to reach safety, including land, sea, and air. Many are taking maritime routes to neighbouring Caribbean islands, a trend that has increased in recent years. Many travel without documents, which can put them at risk from smugglers and traffickers. Despite these challenges, countries in the region have opened their borders, providing Venezuelans with access to healthcare, education, and employment. This is a positive step towards offering them a chance at a better life amidst the ongoing crisis.

Sources:

(1): https://www.youtube.com/watch?v=S1gUR8wM5vA&t=336s

(2): https://www.unrefugees.org/news/venezuela-crisis-explained/

(3): https://www.unhcr.org/emergencies/venezuela-situation

(4): https://www.iom.int/venezuelan-refugee-and-migrant-crisis

(5): https://www.brookings.edu/articles/venezuela-refugee-crisis-to-become-the-largest-and-most-underfunded-in-modern-history/

(6): https://www.unhcr.org/refugee-statistics/download/